Memory elements are widely used in computing applications. For example, a typical computing device may include a combination of volatile and non-volatile memory elements to maintain data, program instructions, and the like that are accessed by a processing unit (e.g., a CPU) during operation of the computing device. Memory accesses typically are associated with latencies, which impair performance of the computing device. Accordingly, a processing unit typically includes one or more memory elements, known as caches, to provide requested data or instructions to the processing unit with reduced latency. Typically, in the event of a miss in one cache, the cache in the next higher level of the hierarchy is checked for the desired data before accessing external memory. If the desired data is not found in the next higher level of cache, it is desirable to allocate space in that cache for that data that must be fetched from external memory in an expeditious and efficient manner.